package com.woniu.util;

import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;

import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;

public class JWTUtil {
    private static final String  SECRETKEY = "问渠哪得清如许，唯有源头活水来";//密钥
    /**
     * 创建jwt
     */
    public static String createJWT(Map userMap) throws JOSEException {
        //创建jwt
        //1:创建头部
        //加密方式算法
        //可逆，不可逆，对称（只有一个密钥），非对称（有一个密钥一个公钥）
        JWSHeader header = new JWSHeader.Builder(JWSAlgorithm.HS256)   //HS256是对称加密
                .type(JOSEObjectType.JWT).build();
        //2:创建载荷
//        HashMap<String, Object> h = new HashMap<>();
//        h.put("id",1);
//        h.put("username","laoma");
        Payload payload = new Payload(userMap);

        //3:创建签名 = 加密(头部+载荷+密钥)
        JWSObject jwsObject = new JWSObject(header,payload);

        JWSSigner jwsSigner = new MACSigner(SECRETKEY);//内写密钥
        jwsObject.sign(jwsSigner); //加密方式
//        jwsObject.verify()//解密方法
        return jwsObject.serialize(); //使用序列化 -> 生成jwt

    }

    /**
     * 解密jwt
     */
    public static boolean verifyJWT(String jwt) throws ParseException, JOSEException {
        //可以使用反序列化把jwt字符串，变成jwt对象JWTSObject
        JWSObject jwsObject = JWSObject.parse(jwt);//反序列化
        MACVerifier verifier = new MACVerifier(SECRETKEY);
        return jwsObject.verify(verifier); //解密方法
    }

    /**
     * 得到jwt字符串的用户id
     */
    public static Integer getUseId(String jwt) throws ParseException {
        JWSObject jwsObject = JWSObject.parse(jwt);
        Map<String, Object> userMap = jwsObject.getPayload().toJSONObject();
        Long userid = (Long)userMap.get("id");
        return userid.intValue();
    }
}
